; 定义中断向量表的大小，这里假设为 256 个中断向量
%define IDT_SIZE 256

; 定义中断描述符的结构体
struc idt_entry
    .offset_low:    resw 1
    .selector:      resw 1
    .zero:          resb 1
    .type_attr:     resb 1
    .offset_high:   resw 1
endstruc

; 定义中断向量表
section .bss
    idt: resb IDT_SIZE * idt_entry_size

; 定义 IDT 寄存器结构体
struc idt_ptr
    .limit: resw 1
    .base:  resd 1
endstruc

; 定义 IDT 寄存器的数据
section .data
    idt_register:
        .limit: dw IDT_SIZE * idt_entry_size - 1
        .base:  dd idt

; 中断处理程序示例
section .text
    global _start
    _start:
        ; 初始化 IDT
        call init_idt

        ; 加载 IDT 寄存器
        lidt [idt_register]

        ; 启用中断
        sti

        ; 主循环
        jmp $

; 初始化 IDT 的函数
init_idt:
    mov ecx, 0
init_loop:
    ; 计算当前中断描述符的地址
    lea esi, [idt + ecx * idt_entry_size]

    ; 设置中断描述符的偏移量（这里假设中断处理程序地址为 0）
    mov word [esi + idt_entry.offset_low], 0
    mov word [esi + idt_entry.offset_high], 0

    ; 设置中断描述符的选择子（这里假设为 0x08，即代码段选择子）
    mov word [esi + idt_entry.selector], 0x08

    ; 设置中断描述符的类型属性（这里假设为 0x8E，即 32 位中断门）
    mov byte [esi + idt_entry.type_attr], 0x8E

    ; 设置中断描述符的保留位为 0
    mov byte [esi + idt_entry.zero], 0

    ; 递增计数器
    inc ecx

    ; 检查是否初始化完所有中断描述符
    cmp ecx, IDT_SIZE
    jl init_loop

    ret